package co.edu.poligran.cluseva.util;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import co.edu.poligran.cluseva.lector.Lector;
import co.edu.poligran.cluseva.lector.LectorArff;

import weka.core.Attribute;
import weka.core.Instance;
import weka.core.Instances;

public class Agrupamiento {

	private Instances dataAgrupamiento;
	private Instances centroidsAgrupamiento;
	private List<Grupo> grupos;

	public Agrupamiento(Instances dataAgrupamiento,
			Instances centroidsAgrupamiento) {
		this.dataAgrupamiento = dataAgrupamiento;
		this.centroidsAgrupamiento = centroidsAgrupamiento;
		this.grupos = new ArrayList<Grupo>();
		crearGruposF();
	}

	
	public void crearGruposF(){
		Enumeration<String> centroides = dameCentroides();
		//Instances dataGrupo =   dataAgrupamiento;
		List<Instance> dataGrupo  = new ArrayList<Instance>();
		int cont=0;
		while( centroides.hasMoreElements() ){
			Instance centroide = centroidsAgrupamiento.instance(cont); 
			String centroideClusterActual = centroides.nextElement();
			for( int i=0 ; i<dataAgrupamiento.numInstances() ; i++ ){
				Instance instancia = dataAgrupamiento.instance(i);
				Attribute centroideAttribute = instancia.attribute( instancia.numAttributes() - 1 );
				if( instancia.toString(centroideAttribute).equals(centroideClusterActual) ){
					//System.out.println( centroide );
					dataGrupo.add(instancia);
				}
				
			}
			Grupo grupo = new Grupo(dataGrupo, centroide);
			grupos.add(grupo);
			cont++;
		}
		//System.out.println( grupos.size() );
	}
	
	public Enumeration<String> dameCentroides(){
		Enumeration<String> enumeration = null;
		Instance instanciaCentroide = centroidsAgrupamiento.instance(0);
		Attribute attribute = instanciaCentroide.attribute( instanciaCentroide.numAttributes() - 1 );
		enumeration = attribute.enumerateValues(); 
		return enumeration;
	}
	
	public static void main( String [] f ){
		try{
			Lector lector = new LectorArff();

			String archivoAgrupamiento = "data/archivoAgrupamientoIrisPeque.arff";
			Instances data = lector.cargarArchivo(archivoAgrupamiento);

			String archivoCentroides = "data/archivoCentroidsIris.arff";
			Instances centroids = lector.cargarArchivo(archivoCentroides);
			
			Agrupamiento clustering = new Agrupamiento(data, centroids);
			
			List<Grupo> grupos = clustering.getGrupos();
			for( int i=0; i<grupos.size(); i++ ){
				System.out.println( grupos.get(i) );
			}
		}
		catch( Exception e ){ e.printStackTrace(); }
	}

	public List<Grupo> getGrupos() {
		return grupos;
	}

	public void setGrupos(List<Grupo> grupos) {
		this.grupos = grupos;
	}
}
